//
//  LYTableView.h
//  LYFormView
//
//  Created by cqck on 2021/12/7.
//

#import <UIKit/UIKit.h>

#import <LYTableModule/LYTableLeftItem.h>

typedef NS_ENUM(NSUInteger, LYTableType) {
    ///普通列表类型
    LYTableTypePlain,
    ///分组列表类型
    LYTableTypeGroup,
};

typedef NS_ENUM(NSUInteger, LYTableEditStyle) {
    LYTableEditStyleSelect,
    LYTableEditStyleDelete,
};

typedef NS_ENUM(NSUInteger, LYTableCellGetType) {
    ///通过dequeueReusableCellWithIdentifier获取
    LYTableCellGetTypeReusable,
    ///通过cellWidthPath获取
    LYTableCellGetTypePath,
};

@protocol LYTableViewDelegate;

@interface LYTableView : UIView

@property (nonatomic, assign) BOOL leftEditing;
@property (nonatomic, assign) BOOL editing;
@property (nonatomic, assign) CGFloat rowHeight;
@property (nonatomic, strong, readonly) UITableView *contentView;
@property (nonatomic, weak) id<LYTableViewDelegate> delegate;

/*!
 * @brief 创建列表视图
 *
 * @param type 列表类型
 * @return LYTableView 实体
 */
- (instancetype)initWithTableType:(LYTableType)type;

/*!
 * @brief 设置提示视图
 *
 * @param hintView 视图
 */
- (void)bindHintView:(UIView *)hintView;

/*!
 * @brief 显示提示视图
 */
- (void)showHintView;

/*!
 * @brief 隐藏提示视图
 */
- (void)hiddenHintView;

/*!
 * @brief 注册需要展示的Cell
 * 
 * @param identifiers cell数组
 */
- (void)registerCellIdentifier:(NSArray<NSString *> *)identifiers;

/*!
 * @brief 重新加载数据
 *
 * @param datas 添加的数据
 */
- (void)reloadWithDatas:(NSArray<NSArray<id> *> *)datas;

/*!
 * @brief 增加数据
 *
 * @param datas 添加的数据
 */
- (void)appendDatas:(NSArray<NSArray<id> *> *)datas;

/*!
 * @brief 更换数据
 *
 * @param datas 更换的数据
 */
- (void)changeDatas:(NSArray<NSArray<id> *> *)datas;

/*!
 * @brief 设置MJRefresh列表头刷新
 *
 * @param target 方法所在目标对象
 * @param action 方法
 */
- (void)bindHeaderRefreshWithTarget:(id)target action:(SEL)action;

/*!
 * @brief 设置MJRefresh列表底部刷新
 *
 * @param target 方法所在目标对象
 * @param action 方法
 */
- (void)bindFooterRefreshWithTarget:(id)target action:(SEL)action;

/*!
 * @brief 打开顶部刷新
 */
- (void)enableRefreshHeader;

/*!
 * @brief 关闭顶部刷新
 */
- (void)disableRefreshHeader;

/*!
 * @brief 打开底部刷新
 */
- (void)enableRefreshFooter;

/*!
 * @brief 关闭底部刷新
 */
- (void)disableRefreshFooter;

/*!
 * @brief 开始下拉刷新
 */
- (void)startHeaderRefresh;

/*!
 * @brief 开始上提刷新
 */
- (void)startFooterRefresh;

/*!
 * @brief 结束刷新
 */
- (void)endRefresh;

@end

@protocol LYTableViewDelegate <NSObject>

@optional
///配置分组数量
- (NSInteger)sectionCountWithView:(LYTableView *)tableView;
///配置每个分组cell数量
- (NSInteger)rowCountWithSectionIndex:(NSInteger)index view:(LYTableView *)tableView;
///获取cell标识
- (NSString *)cellIdentifierWithPath:(NSIndexPath *)indexPath view:(LYTableView *)tableView;
///获取cell数据
- (id)cellDataWithPath:(NSIndexPath *)indexPath view:(LYTableView *)tableView;
///未实现LYTableViewCellProtocol接口的cell对象的处理
- (void)customCell:(id)cell path:(NSIndexPath *)indexPath view:(LYTableView *)tableView;
///设置section的头视图
- (UIView *)headerWithSectionIdx:(NSInteger)sectionIdx view:(LYTableView *)tableView;
///设置section的头视图高度
- (CGFloat)headerHeightWithSectionIdx:(NSInteger)sectionIdx view:(LYTableView *)tableView;
///设置section的脚视图
- (UIView *)footerWithSectionIdx:(NSInteger)sectionIdx view:(LYTableView *)tableView;
///设置section的脚视图高度
- (CGFloat)footerHeightWithSectionIdx:(NSInteger)sectionIdx view:(LYTableView *)tableView;
///设置左滑操作按钮视图
- (NSArray<LYTableLeftItem *> *)itemWithPath:(NSIndexPath *)indexPath view:(LYTableView *)tableView;
///选中的cell
- (void)selectCellWithPath:(NSIndexPath *)indexPath view:(LYTableView *)tableView;

- (void)tableViewEndScroll:(LYTableView *)tableView visibleCellPaths:(NSArray *)indexPaths;

- (CGFloat)tableRowHeightWithPath:(NSIndexPath *)indexPath view:(LYTableView *)tableView;

- (LYTableEditStyle)tableEditStyleWithPath:(NSIndexPath *)indexPath view:(LYTableView *)tableView;

- (NSArray *)lySectionIndexTitlesForTableView:(LYTableView *)tableView;

- (NSInteger)lySectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index view:(LYTableView *)tableView;

- (NSString *)lyTitleForHeaderInSection:(NSInteger)section view:(LYTableView *)tableView;

- (void)lyTableScroll:(LYTableView *)tableView;

- (NSString *)lyCustomCellIdentifier:(NSString *)cellName;

- (void)lyTableWillShowCell:(id)cell indexPath:(NSIndexPath *)indexPath view:(LYTableView *)tableView;

- (void)lyTableWillBeginDragging:(LYTableView *)tableView;

- (void)lyTableWillScroll:(LYTableView *)tableView;

- (LYTableCellGetType)lyCellGetType;

@end
